{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.empty((100, 2))\n",
    "X[:, 0] = np.random.uniform(0., 100., size=100)\n",
    "X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0., 10., size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7f9d801e5090>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# np.random.uniform()产生的是一组均匀分布在指定范围内的数\n",
    "point = np.random.uniform(0., 100., size=100)\n",
    "plt.scatter(point, y= range(100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from encapsulations.PCA import PCA\n",
    "pca = PCA(n_components=2)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.77101648,  0.63681519],\n",
       "       [ 0.63681641, -0.77101547]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 降维至1维\n",
    "X_reduction = pca.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将数据恢复到2维\n",
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_restore.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0], X[:,1], color='r', alpha=0.5) # X\n",
    "plt.scatter(X_restore[:,0], X_restore[:,1], color='b') # 恢复后的X\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
